class Solution {
public:
    bool circularArrayLoop(vector<int>& nums) {
        int n = nums.size(), index;
        for(int i = 0; i < nums.size(); i++){//所有点都作为起点走一遍
            if(!nums[i])continue;//已经被从别的点开始的路径排除了
            index = i;
            bool flag = (nums[index] > 0 ? true : false);
            int counter = 0;//整一个计数器
            while(true){
                int temp = ((nums[index] + index) % n + n) % n;//下一个位置
                if(temp == index){ // 原地 TP
                    nums[index] = 0;
                    break;
                }
                if((flag && nums[index] < 0) || (!flag && nums[index] > 0) || !nums[index]){// 反向或者遇见 0
                    int j = i;
                    while(j != index){
                        int t = j;
                        j = ((nums[j] + j) % n + n) % n;
                        nums[t] = 0;
                    }
                    break;
                }
                if(temp == i && counter > n)return true;// 回到原地或者 一定 走完了一轮。
                index = temp;
                counter++;
            }
        }
        return false;
    }
};

/**
 * 2021.8.9
 * 只使用若干变量，失败的尝试过的路径都用 0 标记，后面再碰见直接舍弃。
 * 原地 TP 的不行，反向的不行，只有走完一轮的才行。
 */